从 IP 地址找到 MAC 地址
复习
- IP 地址:由 32 位组成,点分十进制只是它的显示形式
- 子网与 CIDR:CIDR 用前缀长度表示地址范围
- 地址怎样自动获得:DHCP 自动为主机提供地址、前缀、网关等配置
TL;DR
- ARP 在 IPv4 本地网络中把下一跳 IP 地址解析为 MAC 地址
- 解析结果会暂存在 ARP 缓存中
- 跨网络时,ARP 找的是网关的 MAC,而不是远端主机的
正文
我们已经走到最后一步了。主机决定好下一跳是“同网目标”还是“网关”之后,仍然面临一个很具体的问题:IP 地址是知道了,可帧要用 MAC 地址,这两者怎么对上?
这个把 IP 地址翻译成 MAC 地址的工作,由 ARP(地址解析协议)完成。
广播提问,单播回答
ARP 的做法很直白:
- 主机在本地网络里广播一个问题:“谁拥有这个 IP 地址?”
- 拥有该地址的设备单播回复自己的 MAC 地址
- 得到答案后,主机把它暂存在 ARP 缓存里,下次就不用再问了
又是一次“广播提问、定向回答”的组合。之所以先广播,是因为此刻只知道对方的 IP,不知道它的 MAC;而广播能让本地网络里所有设备都听见,真正的主人自然会回应。
跨网络时,找的是网关
这里有一个特别容易搞混的点:当目标在远端网络时,ARP 找的并不是远端主机的 MAC,而是网关的 MAC。
为什么?因为发往远端的帧,当前这一跳根本到不了远方。主机能做的,只是先把帧交给本地那个“能继续转发”的网关。至于之后怎么走,是网关的事。所以这一跳要解析的,是网关的地址。
这正是 MAC 地址“只管本地交付”这一性质的体现:无论最终目的地在多远,ARP 解决的永远只是当前这一跳。
至此,一条数据从应用程序出发,经过层层封装、寻址、路由、本地交付,最终抵达对方——这条完整的路,我们终于走通了。
思考题 1
发往远端网站的帧为何使用网关 MAC?
思考题 2
ARP 缓存为什么必须存在?如果没有缓存,每次通信都重新解析,会怎样?
小结
知识点
- ARP 把 IPv4 本地网络中的 IP 地址解析为 MAC 地址
- 广播请求、单播应答,结果存入 ARP 缓存
- 跨网络时解析的是网关 MAC,而非远端主机 MAC
参考资料
- Wikipedia(zh):地址解析协议:在本地网络把 IP 地址解析为 MAC 地址
- Wikipedia(zh):MAC地址:ARP 解析得到的目标,即链路层接口地址
思考题答案(仅供参考)
思考题 1
远端不在本链路,当前这一跳只能先交给能继续转发的网关。所以主机需要把帧交付给网关这个本地设备,自然要解析网关的 MAC 地址。远端主机的 MAC 对当前这一跳没有意义。
思考题 2
缓存避免了每次通信都重新广播解析。如果没有缓存,每一帧都要先广播一遍“谁拥有这个 IP”,既增加延迟,又给本地网络带来大量额外流量。缓存让重复的解析结果得以复用,是性能上的必要优化。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图

设计师 | 南国微雪